/**
 * Werwolftool-Spielleiterfunktionen
 * @author JANNiS <jannis@huffle-home.de>
 */

/**
 * Das Spiel
 */
var Spiel = new Class({
	/**
	 * Array mit allen Spielern
	 */
	spieler: [],
	/**
	 * Array mit allen Rollen
	 */
	rollen: [],
	/**
	 * Die Auswertung für den aktuellen Tag
	 */
	auswertung: new Auswertung(),
	
	/**
	 * Prüft, ob ein Spieler mit angegebenen Namen existiert
	 * Geht alle Spieler durch, wenn mind. einer den Namen hat -> true
	 * @argument name Name des Spielers
	 * @return ob der Spieler existiert
	 */
	kenntSpieler: function(name) {
		// prüfe ob Spieler im Spieler-Array mindestens einmal vorkommt und gebe das zurück
		return this.spieler.some(function(spieler) {
			return spieler.get("name") == name;
		});
	},
	/**
	 * Erstellt einen neuen Spieler
	 * Falls er bereits existiert wird false zurückgegeben
	 * @argument name Name des zu erstellenden Spielers
	 * @return der neue Spieler (false, falls Spieler bereits existiert)
	 */
	neuerSpieler: function(name) {
		// falls spieler bereits existiert ...
		if(this.kenntSpieler(name)) {
			// .. gib false zurück
			return false;
		}
		// ... sonst ...
		else {
			// ... erstelle neuen Spieler
			var neuerSpieler = new Spieler(name);
			// Speichere ihn in Array
			this.spieler.push(neuerSpieler);
			// und gib ihn zurück
			return neuerSpieler;
		}
	},
	/**
	 * Gibt einen Spieler zurück
	 * falls nicht gefunden wird null zurückgegeben
	 * @argument name Name des Spielers
	 * @return Spieler, oder null, falls keiner gefunden wurde
	 */
	getSpieler: function(name) {
		// falls name ein Objekt ist...
		if($type(name) == "object") {
			// Namen (=Spieler) zurückgeben
			return name;
		}
		// ... sonst ...
		else {
			// falls Name nicht leer und Spieler bekannt...
			if(name != "" && this.kenntSpieler(name)) {
				// durchsuche jeden Spieler und merke alle gefundenen
				var spieler = this.spieler.filter(function(item, index) {
					return item.get("name") == name;
				});
				// gib den ersten zurück (weil ein Spieler ja nicht mehrmals vorkommen kann)
				return spieler[0];
			}
			// ... sonst (falls name leer oder Spieler nicht bekannt)
			else {
				// gib null zurück
				return null;
			}
		}
	},
	/**
	 * Entfernt den Spieler aus der Spielerliste
	 * macht nichts, falls der Spieler nicht existiert
	 * @argument name Name des Spielers
	 */
	spielerEntfernen: function(name) {
		// Alle Spieler durchgehen ...
		this.spieler.each(function(spieler, index) {
			// falls der Spielername übereinstimmt ...
			if(spieler.get("name") == name) {
				// Spieler aus der Rolle löschen
				spieler.get("rolle").removeSpieler(spieler);
				// Rolle löschen, falls letzter Spieler mit dieser Rolle
				this.rolleEntfernen(spieler.get("rolle"));
				// Spieler löschen
				this.spieler.splice(index, 1);
			}
		}, this);
		
		// Verbleibende Spieler durchgehen ...
		this.spieler.each(function(spieler) {
			// falls der Spieler auf den zu löschenden Spieler gestimmt hat ...
			if(spieler.get("stimme") == name) {
				// Stimme löschen
				spieler.set("stimme", null);
			}
			// Stimmen auf den Spieler merken
			var stimmen = spieler.get("stimmen");
			// falls der zu löschende Spieler auf diesen Spieler gestimmt hat...
			if(stimmen.contains(name)) {
				// Stimme löschen
				stimmen.erase(name);
				// Neu zuweisen
				spieler.set("stimmen", stimmen);
			}
		});
	},
	/**
	 * Prüft, ob eine Rolle mit angegebenen Namen existiert
	 * @argument name Name der Rolle
	 * @return ob die Rolle existiert
	 */
	kenntRolle: function(name) {
		// prüfe alle Rollen und gib das zurück
		return this.rollen.some(function(rolle) {
			return rolle.get("name") == name;
		});
	},
	/**
	 * Erstellt eine neue Rolle
	 * falls Rolle bereits existiert -> false
	 * @argument name Name der neuen Rolle
	 * @return die neue Rolle (false, falls Rolle bereits existiert)
	 */
	neueRolle: function(name) {
		// falls Rolle bereits existiert ...
		if(this.kenntRolle(name)) {
			// ... gib false zurück
			return false;
		}
		// ... sonst ...
		else {
			// ... erstelle neue Rolle
			var neueRolle = new Rolle(name);
			// speichere sie im Rollen-Array
			this.rollen.push(neueRolle);
			// und gib sie zurück
			return neueRolle;
		}
	},
	/**
	 * Gibt eine Rolle zurück
	 * falls nicht gefunden wird null zurückgegeben
	 * @argument name Name der Rolle
	 * @return Rolle, oder null, falls keine gefunden wurde
	 */
	getRolle: function(name) {
		// falls name ein Objekt ist...
		if($type(name) == "object") {
			// Namen (=Rolle) zur�ckgeben
			return name;
		}
		// ... sonst ...
		else {
			// prüft ob Rolle bekannt und nicht leer
			if(name != "" && this.kenntRolle(name)) {
				// gehe alle Rollen durch
				var rollen = this.rollen.filter(function(rolle, index) {
					// merke die gefundenen
					return rolle.get("name") == name;
				});
				// gib die erste zurück (da sowieso alle gleich sind)
				return rollen[0];
			}
			// falls nicht gefunden oder leer
			else {
				// gib null zurück
				return null;
			}
		}
	},
	/**
	 * Entfernt eine Rolle, sofern sie keine Spieler mehr hat
	 * @argument rolle Zu entfernende Rolle
	 * @return ob Rolle gel�scht wurde (false, falls sie noch Spieler hatte, sonst true)
	 */
	rolleEntfernen: function(rolle) {
		// Rollenname merken
		var rollenname = rolle.get("name");
		
		// falls die Rolle noch Spieler hat ...
		if(rolle.get("spieler").length != 0) {
			// false zurückgeben
			return false;
		}
		// ... sonst ...
		else {
			// Alle Rollen durchgehen ...
			this.rollen.each(function(rolle, index) {
				// falls der Rollenname übereinstimmt ...
				if(rolle.get("name") == rollenname) {
					// Rolle löschen
					this.rollen.splice(index, 1);
				}
			}, this);
			
			// true zurückgeben
			return true;
		}
	},
	/**
	 * Löscht alle Stimmen
	 */
	neuerTag: function() {
		this.spieler.each(function(spieler) {
			spieler.set("stimme", null);
			spieler.set("stimmen", []);
		});
	}
});